package cn.iocoder.yudao.module.trade.service.order.handler;

import com.alibaba.fastjson.JSON; // 以FastJSON为例，其他JSON库类似

import java.lang.reflect.Array;
import java.util.Collection;

public class JsonParser {

    /**
     * 将JSON字符串解析为指定类型的对象
     * 
     * @param jsonStr JSON字符串
     * @param clazz   目标类型的Class对象
     * @param <T>     目标类型
     * @return 解析后的对象
     * 
     * 使用示例：
     * String str = parseJson("{}", String.class);
     * User user = parseJson("{\"name\":\"John\"}", User.class);
     */
    public static <T> T parseJson(String jsonStr, Class<T> clazz) {
        if (jsonStr == null || jsonStr.trim().isEmpty()) {
            // 处理空或空白JSON的情况
            return handleEmptyJson(clazz);
        }
        return JSON.parseObject(jsonStr, clazz);
    }

    /**
     * 处理空JSON的特殊情况
     */
    private static <T> T handleEmptyJson(Class<T> clazz) {
        // 根据不同类型返回默认值
        if (clazz == String.class) {
            return clazz.cast("");  // 空字符串
        } else if (clazz == Integer.class || clazz == int.class) {
            return clazz.cast(0);   // 0
        } else if (clazz == Boolean.class || clazz == boolean.class) {
            return clazz.cast(false); // false
        } else if (clazz.isArray()) {
            return clazz.cast(Array.newInstance(clazz.getComponentType(), 0)); // 空数组
        } else if (Collection.class.isAssignableFrom(clazz)) {
            try {
                return clazz.getDeclaredConstructor().newInstance(); // 空集合
            } catch (Exception e) {
                return null;
            }
        }
        return null; // 其他类型返回null
    }

    /**
     * 带默认值的重载方法
     * 
     * @param defaultValue 解析失败时返回的默认值
     */
    public static <T> T parseJson(String jsonStr, Class<T> clazz, T defaultValue) {
        try {
            T result = parseJson(jsonStr, clazz);
            return result != null ? result : defaultValue;
        } catch (Exception e) {
            return defaultValue;
        }
    }
}